﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиСсылка
{
	///<summary>
	///(Общ)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class ДоговорыКонтрагентов:СправочникСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("f77d42e4-148c-4450-ad6a-47b092128306");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012031.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public bool Предопределенный {get;set;}
		public Guid Владелец {get;set;}
		public V82.СправочникиСсылка.ДоговорыКонтрагентов Родитель {get;set;}
		public bool ЭтоГруппа {get;set;}
		public string/*9*/ Код {get;set;}
		[DataMember(Name = "Представление")]//Проверить основное представление.
		[ProtoMember(3)]
		public string/*50*/ Наименование {get;set;}
		///<summary>
		///(Общ) Определяет валюту взаиморасчетов по договору, не может меняться, если по договору проведен хотя бы один документ
		///</summary>
		public V82.СправочникиСсылка.Валюты ВалютаВзаиморасчетов {get;set;}//Валюта взаиморасчетов
		///<summary>
		///(Общ)
		///</summary>
		public V82.Перечисления/*Ссылка*/.ВедениеВзаиморасчетовПоДоговорам ВедениеВзаиморасчетов {get;set;}//Ведение взаиморасчетов
		///<summary>
		///(Общ) Любая дополнительная информация
		///</summary>
		public string/*(0)*/ Комментарий {get;set;}
		///<summary>
		///(Упр) 
		///</summary>
		public V82.Перечисления/*Ссылка*/.ВидыУсловийДоговоровВзаиморасчетов ВидУсловийДоговора {get;set;}//Вид условий договора
		///<summary>
		///(Упр) Держать резерв без оплаты ограниченное/неограниченное время
		///</summary>
		public bool ДержатьРезервБезОплатыОграниченноеВремя {get;set;}//Держать резерв без оплаты ограниченное время
		///<summary>
		///(Упр) 
		///</summary>
		public decimal/*(15.2)*/ ДопустимаяСуммаЗадолженности {get;set;}//Допустимая сумма дебиторской задолженности
		///<summary>
		///(Упр) 
		///</summary>
		public decimal/*(10)*/ ДопустимоеЧислоДнейЗадолженности {get;set;}//Допустимое число дней дебиторской задолженности
		///<summary>
		///(Общ) 
		///</summary>
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		///<summary>
		///(Упр) 
		///</summary>
		public bool КонтролироватьСуммуЗадолженности {get;set;}//Контролировать сумму дебиторской задолженности
		///<summary>
		///(Упр) 
		///</summary>
		public bool КонтролироватьЧислоДнейЗадолженности {get;set;}//Контролировать число дней дебиторской задолженности
		///<summary>
		///(Общ) Обособленный партионный учет Товаров по заказам покупателей
		///</summary>
		public bool ОбособленныйУчетТоваровПоЗаказамПокупателей {get;set;}//Обособленный учет Товаров по заказам покупателей
		///<summary>
		///(Общ) 
		///</summary>
		public decimal/*(5.2)*/ ПроцентКомиссионногоВознаграждения {get;set;}//Процент комиссионного вознаграждения
		///<summary>
		///(Общ) 
		///</summary>
		public V82.Перечисления/*Ссылка*/.СпособыРасчетаКомиссионногоВознаграждения СпособРасчетаКомиссионногоВознаграждения {get;set;}//Способ расчета комиссионного вознаграждения
		///<summary>
		///(Упр) 
		///</summary>
		public decimal/*(5.2)*/ ПроцентПредоплаты {get;set;}//Процент предоплаты
		///<summary>
		///(Общ) Тип цен по умолчанию для оформления покупок по данному договору
		///</summary>
		public object ТипЦен {get;set;}//Тип цен
		///<summary>
		///(Общ)
		///</summary>
		public V82.Перечисления/*Ссылка*/.ВидыДоговоровКонтрагентов ВидДоговора {get;set;}//Вид договора
		///<summary>
		///(Упр) Если 0, то неограничено
		///</summary>
		public decimal/*(10)*/ ЧислоДнейРезерваБезОплаты {get;set;}//Число дней резерва без оплаты
		///<summary>
		///Признак того что в данном договоре организация выступает в качестве налогового агента
		///</summary>
		public bool УчетАгентскогоНДС {get;set;}//Учет агентского НДС
		///<summary>
		///Разновидность договора с обязанностью оплаты организацией НДС в качестве налогового агента 
		///</summary>
		public V82.Перечисления/*Ссылка*/.ВидыАгентскихДоговоров ВидАгентскогоДоговора {get;set;}//Вид агентского договора
		///<summary>
		///(Регл)
		///</summary>
		public bool РасчетыВУсловныхЕдиницах {get;set;}//Расчеты в условных единицах
		public bool КонтролироватьДенежныеСредстваКомитента {get;set;}//Контролировать денежные средства комитента
		public bool РеализацияНаЭкспорт {get;set;}//Реализация на экспорт
		public DateTime Дата {get;set;}
		public string/*(20)*/ Номер {get;set;}
		///<summary>
		///(Упр)
		///</summary>
		public V82.СправочникиСсылка.ВидыВзаиморасчетов ВидВзаиморасчетов {get;set;}//Вид взаиморасчетов
		public bool ВестиПоДокументамРасчетовСКонтрагентом {get;set;}//Вести по документам расчетов с контрагентом
		public object ОсновнойПроект {get;set;}//Основной проект
		public V82.СправочникиСсылка.СтатьиДвиженияДенежныхСредств ОсновнаяСтатьяДвиженияДенежныхСредств {get;set;}//Основная статья движения денежных средств
		public DateTime СрокДействия {get;set;}//Срок действия договора
		public V82.СправочникиСсылка.Номенклатура НаименованиеДляСчетаФактурыНаАванс {get;set;}//Обобщенное наименование товаров для счета-фактуры на аванс
		public V82.Перечисления/*Ссылка*/.ПорядокРегистрацииСчетовФактурНаАванс ПорядокРегистрацииСчетовФактурНаАвансПоДоговору {get;set;}//Порядок регистрации счетов-фактур на аванс по договору
		public bool НалоговыйАгентПоОплате {get;set;}//НДС при исполнении обязанностей налогового агента начисляется по оплате
		///<summary>
		///Если не установлен, для контроля просроченной задолженности используется срок из учетной политики организации
		///</summary>
		public bool УстановленСрокОплатыДляРезервовПоСомнительнымДолгам {get;set;}//Установлен срок оплаты для резервов по сомнительным долгам
		///<summary>
		///Срок в днях, после которого долг считается просроченным
		///</summary>
		public decimal/*(5)*/ СрокОплатыДляРезервовПоСомнительнымДолгам {get;set;}//Срок оплаты для резервов по сомнительным долгам
		
		public ДоговорыКонтрагентов()
		{
		}
		
		public ДоговорыКонтрагентов(byte[] УникальныйИдентификатор)
			: this(УникальныйИдентификатор,0)
		{
		}
		
		public ДоговорыКонтрагентов(byte[] УникальныйИдентификатор,int Глубина)
		{
			if (Глубина>3)
			{
				return;
			}
			if (new Guid(УникальныйИдентификатор) == Guid.Empty)
			{
				return;
			}
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_IsMetadata [Предопределенный]
					,_ParentIDRRef [Родитель]
					,_Folder [ЭтоГруппа]
					,_Code [Код]
					,_Description [Наименование]
					,_Fld1062RRef [ВалютаВзаиморасчетов]
					,_Fld1063RRef [ВедениеВзаиморасчетов]
					,_Fld1069 [Комментарий]
					,_Fld1065RRef [ВидУсловийДоговора]
					,_Fld1066 [ДержатьРезервБезОплатыОграниченноеВремя]
					,_Fld1067 [ДопустимаяСуммаЗадолженности]
					,_Fld1068 [ДопустимоеЧислоДнейЗадолженности]
					,_Fld1073RRef [Организация]
					,_Fld1070 [КонтролироватьСуммуЗадолженности]
					,_Fld1071 [КонтролироватьЧислоДнейЗадолженности]
					,_Fld1072 [ОбособленныйУчетТоваровПоЗаказамПокупателей]
					,_Fld1074 [ПроцентКомиссионногоВознаграждения]
					,_Fld1076RRef [СпособРасчетаКомиссионногоВознаграждения]
					,_Fld1075 [ПроцентПредоплаты]
					,_Fld1077_TYPE [ТипЦен_Тип],_Fld1077_RRRef [ТипЦен],_Fld1077_RTRef [ТипЦен_Вид]
					,_Fld1079RRef [ВидДоговора]
					,_Fld1078 [ЧислоДнейРезерваБезОплаты]
					,_Fld1080 [УчетАгентскогоНДС]
					,_Fld1081RRef [ВидАгентскогоДоговора]
					,_Fld1083 [РасчетыВУсловныхЕдиницах]
					,_Fld1082 [КонтролироватьДенежныеСредстваКомитента]
					,_Fld1086 [РеализацияНаЭкспорт]
					,_Fld1084 [Дата]
					,_Fld1085 [Номер]
					,_Fld1064RRef [ВидВзаиморасчетов]
					,_Fld1087 [ВестиПоДокументамРасчетовСКонтрагентом]
					,_Fld1088_TYPE [ОсновнойПроект_Тип],_Fld1088_RRRef [ОсновнойПроект],_Fld1088_RTRef [ОсновнойПроект_Вид]
					,_Fld1090RRef [ОсновнаяСтатьяДвиженияДенежныхСредств]
					,_Fld1091 [СрокДействия]
					,_Fld26523RRef [НаименованиеДляСчетаФактурыНаАванс]
					,_Fld26524RRef [ПорядокРегистрацииСчетовФактурНаАвансПоДоговору]
					,_Fld26525 [НалоговыйАгентПоОплате]
					,_Fld26526 [УстановленСрокОплатыДляРезервовПоСомнительнымДолгам]
					,_Fld26527 [СрокОплатыДляРезервовПоСомнительнымДолгам]
					From _Reference45(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор  -- and _Folder = 0x01  ";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Предопределенный = ((byte[])Читалка.GetValue(3))[0]==1;
							Родитель = new V82.СправочникиСсылка.ДоговорыКонтрагентов((byte[])Читалка.GetValue(4),Глубина+1);
							ЭтоГруппа = ((byte[])Читалка.GetValue(5))[0]==0;
							Код = Читалка.GetString(6);
							Наименование = Читалка.GetString(7);
							if(!ЭтоГруппа)
							{
								ВалютаВзаиморасчетов = new V82.СправочникиСсылка.Валюты((byte[])Читалка.GetValue(8),Глубина+1);
								ВедениеВзаиморасчетов = V82.Перечисления/*Ссылка*/.ВедениеВзаиморасчетовПоДоговорам.ПустаяСсылка.Получить((byte[])Читалка.GetValue(9));
								Комментарий = Читалка.GetString(10);
								ВидУсловийДоговора = V82.Перечисления/*Ссылка*/.ВидыУсловийДоговоровВзаиморасчетов.ПустаяСсылка.Получить((byte[])Читалка.GetValue(11));
								ДержатьРезервБезОплатыОграниченноеВремя = ((byte[])Читалка.GetValue(12))[0]==1;
								ДопустимаяСуммаЗадолженности = Читалка.GetDecimal(13);
								ДопустимоеЧислоДнейЗадолженности = Читалка.GetDecimal(14);
								Организация = new V82.СправочникиСсылка.Организации((byte[])Читалка.GetValue(15),Глубина+1);
								КонтролироватьСуммуЗадолженности = ((byte[])Читалка.GetValue(16))[0]==1;
								КонтролироватьЧислоДнейЗадолженности = ((byte[])Читалка.GetValue(17))[0]==1;
								ОбособленныйУчетТоваровПоЗаказамПокупателей = ((byte[])Читалка.GetValue(18))[0]==1;
								ПроцентКомиссионногоВознаграждения = Читалка.GetDecimal(19);
								СпособРасчетаКомиссионногоВознаграждения = V82.Перечисления/*Ссылка*/.СпособыРасчетаКомиссионногоВознаграждения.ПустаяСсылка.Получить((byte[])Читалка.GetValue(20));
								ПроцентПредоплаты = Читалка.GetDecimal(21);
								ВидДоговора = V82.Перечисления/*Ссылка*/.ВидыДоговоровКонтрагентов.ПустаяСсылка.Получить((byte[])Читалка.GetValue(25));
								ЧислоДнейРезерваБезОплаты = Читалка.GetDecimal(26);
								УчетАгентскогоНДС = ((byte[])Читалка.GetValue(27))[0]==1;
								ВидАгентскогоДоговора = V82.Перечисления/*Ссылка*/.ВидыАгентскихДоговоров.ПустаяСсылка.Получить((byte[])Читалка.GetValue(28));
								РасчетыВУсловныхЕдиницах = ((byte[])Читалка.GetValue(29))[0]==1;
								КонтролироватьДенежныеСредстваКомитента = ((byte[])Читалка.GetValue(30))[0]==1;
								РеализацияНаЭкспорт = ((byte[])Читалка.GetValue(31))[0]==1;
								Дата = Читалка.GetDateTime(32);
								Номер = Читалка.GetString(33);
								ВидВзаиморасчетов = new V82.СправочникиСсылка.ВидыВзаиморасчетов((byte[])Читалка.GetValue(34),Глубина+1);
								ВестиПоДокументамРасчетовСКонтрагентом = ((byte[])Читалка.GetValue(35))[0]==1;
								ОсновнаяСтатьяДвиженияДенежныхСредств = new V82.СправочникиСсылка.СтатьиДвиженияДенежныхСредств((byte[])Читалка.GetValue(39),Глубина+1);
								СрокДействия = Читалка.GetDateTime(40);
								НаименованиеДляСчетаФактурыНаАванс = new V82.СправочникиСсылка.Номенклатура((byte[])Читалка.GetValue(41),Глубина+1);
								ПорядокРегистрацииСчетовФактурНаАвансПоДоговору = V82.Перечисления/*Ссылка*/.ПорядокРегистрацииСчетовФактурНаАванс.ПустаяСсылка.Получить((byte[])Читалка.GetValue(42));
								НалоговыйАгентПоОплате = ((byte[])Читалка.GetValue(43))[0]==1;
								УстановленСрокОплатыДляРезервовПоСомнительнымДолгам = ((byte[])Читалка.GetValue(44))[0]==1;
								СрокОплатыДляРезервовПоСомнительнымДолгам = Читалка.GetDecimal(45);
							}
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.СправочникиОбъект.ДоговорыКонтрагентов  ПолучитьОбъект()
		{
			var Объект = new V82.СправочникиОбъект.ДоговорыКонтрагентов();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Предопределенный = Предопределенный;
			Объект.Владелец = Владелец;
			Объект.Родитель = Родитель;
			Объект.ЭтоГруппа = ЭтоГруппа;
			Объект.Код = Код;
			Объект.Наименование = Наименование;
			Объект.ВалютаВзаиморасчетов = ВалютаВзаиморасчетов;
			Объект.ВедениеВзаиморасчетов = ВедениеВзаиморасчетов;
			Объект.Комментарий = Комментарий;
			Объект.ВидУсловийДоговора = ВидУсловийДоговора;
			Объект.ДержатьРезервБезОплатыОграниченноеВремя = ДержатьРезервБезОплатыОграниченноеВремя;
			Объект.ДопустимаяСуммаЗадолженности = ДопустимаяСуммаЗадолженности;
			Объект.ДопустимоеЧислоДнейЗадолженности = ДопустимоеЧислоДнейЗадолженности;
			Объект.Организация = Организация;
			Объект.КонтролироватьСуммуЗадолженности = КонтролироватьСуммуЗадолженности;
			Объект.КонтролироватьЧислоДнейЗадолженности = КонтролироватьЧислоДнейЗадолженности;
			Объект.ОбособленныйУчетТоваровПоЗаказамПокупателей = ОбособленныйУчетТоваровПоЗаказамПокупателей;
			Объект.ПроцентКомиссионногоВознаграждения = ПроцентКомиссионногоВознаграждения;
			Объект.СпособРасчетаКомиссионногоВознаграждения = СпособРасчетаКомиссионногоВознаграждения;
			Объект.ПроцентПредоплаты = ПроцентПредоплаты;
			Объект.ТипЦен = ТипЦен;
			Объект.ВидДоговора = ВидДоговора;
			Объект.ЧислоДнейРезерваБезОплаты = ЧислоДнейРезерваБезОплаты;
			Объект.УчетАгентскогоНДС = УчетАгентскогоНДС;
			Объект.ВидАгентскогоДоговора = ВидАгентскогоДоговора;
			Объект.РасчетыВУсловныхЕдиницах = РасчетыВУсловныхЕдиницах;
			Объект.КонтролироватьДенежныеСредстваКомитента = КонтролироватьДенежныеСредстваКомитента;
			Объект.РеализацияНаЭкспорт = РеализацияНаЭкспорт;
			Объект.Дата = Дата;
			Объект.Номер = Номер;
			Объект.ВидВзаиморасчетов = ВидВзаиморасчетов;
			Объект.ВестиПоДокументамРасчетовСКонтрагентом = ВестиПоДокументамРасчетовСКонтрагентом;
			Объект.ОсновнойПроект = ОсновнойПроект;
			Объект.ОсновнаяСтатьяДвиженияДенежныхСредств = ОсновнаяСтатьяДвиженияДенежныхСредств;
			Объект.СрокДействия = СрокДействия;
			Объект.НаименованиеДляСчетаФактурыНаАванс = НаименованиеДляСчетаФактурыНаАванс;
			Объект.ПорядокРегистрацииСчетовФактурНаАвансПоДоговору = ПорядокРегистрацииСчетовФактурНаАвансПоДоговору;
			Объект.НалоговыйАгентПоОплате = НалоговыйАгентПоОплате;
			Объект.УстановленСрокОплатыДляРезервовПоСомнительнымДолгам = УстановленСрокОплатыДляРезервовПоСомнительнымДолгам;
			Объект.СрокОплатыДляРезервовПоСомнительнымДолгам = СрокОплатыДляРезервовПоСомнительнымДолгам;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.СправочникиСсылка.ДоговорыКонтрагентов ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.СправочникиСсылка.ДоговорыКонтрагентов)Кэш[УИ];
			}
			var Ссылка = new V82.СправочникиСсылка.ДоговорыКонтрагентов(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}